/**
 * 构造长度为N的数组，满足3个条件：
 * 1. 最大值不超过K
 * 2. 和等于X
 * 3. 元素各不相等
 * 首先判断和的范围，最小和为 1,2,...,N
 * 最大和为 K, K-1, ..., K-N+1
 * 如果X不在范围内，则不行
 * 然后构造一个数组为 1,2,...,N
 * 然后从最后一个数依次往前，对每个数i：
 *    看还需要补多少记作need，以及最大能够补多少记作limit
 *    如果 need <= limit，则直接补上，return
 *    否则只能补limit，然后更新limit和need，继续循环
 */
#include <bits/stdc++.h>
using namespace std;

#include <bits/extc++.h>

using llt = long long;
using vi = vector<int>;

int N;
llt K, X;

vector<llt> Ans;

void proc(){
    llt minSum = N * (N + 1LL) / 2;
    if(X < minSum) return (void)Ans.assign(1, -1);

    llt maxSum = 0;
    if(N & 1){
        maxSum = (K + K + 1 - N) / 2 * N;
    }else{
        maxSum = N / 2 * (K + K + 1 - N);
    }
    if(X > maxSum) return (void)Ans.assign(1, -1);

    Ans.assign(N, 0);
    for(int i=0;i<N;++i) Ans[i] = i + 1;

    Ans[N - 1] = X + N - minSum;
    if(Ans[N - 1] <= K) return;

    llt left = Ans[N - 1] - K;
    Ans[N - 1] = K;
    for(int i=N-2;i>=0;--i){
        llt now = Ans[i];
        if(now + left < Ans[i + 1]){
            Ans[i] = now + left;
            return;
        }
        Ans[i] = Ans[i + 1] - 1;
        left = now + left - Ans[i];
    }
    if(0 == left) return;
    return (void)Ans.assign(1, -1);
}

int main(){
#ifndef ONLINE_JUDGE
    freopen("z.txt", "r", stdin);
#endif
    ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
    cin >> N >> K >> X;
    proc();
    for(auto i : Ans) cout << i << " ";
    cout << endl;
    return 0;
}